package com.rain.query;

import com.rain.enums.PageSize;

/**
 * 简单分页对象，用于计算分页参数。
 * 支持自动计算：总页数、起始位置（offset）、结束位置。
 * 注意：设置 pageNo、pageSize、countTotal 后会自动触发计算。
 */
public class SimplePage {

    private int pageNo = 1;           // 当前页码，从1开始
    private long countTotal = 0;      // 总记录数（long 防止溢出）
    private int pageSize = 20;        // 每页大小，默认20
    private int pageTotal = 1;        // 总页数
    private long start = 0;           // 起始索引（offset），用于 LIMIT
    private long end = 0;             // 结束索引（非包含）

    public SimplePage() {
        // 不要用默认构造参数
    }

    public SimplePage(int pageNo, int pageSize) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.calculate();
    }

    public SimplePage(int pageNo, int pageSize, long countTotal) {
        this.pageNo = pageNo;
        this.pageSize = pageSize;
        this.countTotal = countTotal;
        this.calculate();
    }

    /**
     * 重新计算分页参数。
     * 在设置 pageNo、pageSize、countTotal 后自动调用。
     */
    public void calculate() {
        // 校验 pageSize
        if (this.pageSize <= 0) {
            this.pageSize = 20;
        }

        // 计算总页数
        if (this.countTotal > 0) {
            this.pageTotal = (int) ((this.countTotal + this.pageSize - 1) / this.pageSize); // 向上取整
        } else {
            this.pageTotal = 1;
        }

        // 校验页码：不能小于1
        if (this.pageNo < 1) {
            this.pageNo = 1;
        }

        // 只有当有数据时，才限制页码不超过总页数
        // 如果 countTotal=0，允许 pageNo 保持原值（避免被强制改为1）
        if (this.countTotal > 0 && this.pageNo > this.pageTotal) {
            this.pageNo = this.pageTotal;
        }

        // 计算偏移量（防止 int 溢出）
        this.start = (long) (this.pageNo - 1) * this.pageSize;
        this.end = (long) this.pageNo * this.pageSize;
    }

    // ========== Getter ========== //

    /**
     * 获取当前页码（从1开始）
     */
    public int getPageNo() {
        return pageNo;
    }

    /**
     * 设置当前页码，并触发重新计算
     */
    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
        calculate();
    }

    /**
     * 获取总记录数
     */
    public long getCountTotal() {
        return countTotal;
    }

    /**
     * 设置总记录数，并触发重新计算
     */
    public void setCountTotal(long countTotal) {
        this.countTotal = Math.max(0, countTotal); // 防止负数
        calculate();
    }

    /**
     * 获取每页大小
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 设置每页大小，并触发重新计算
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
        calculate();
    }

    /**
     * 获取总页数
     */
    public int getPageTotal() {
        return pageTotal;
    }

    /**
     * 获取起始索引（offset），用于数据库 LIMIT
     */
    public long getStart() {
        return start;
    }

    /**
     * 获取结束索引（非包含）
     */
    public long getEnd() {
        return end;
    }

    /**
     * 手动触发重新计算（例如字段批量修改后）
     */
    public void refresh() {
        calculate();
    }

    @Override
    public String toString() {
        return "SimplePage{" +
                "pageNo=" + pageNo +
                ", pageSize=" + pageSize +
                ", countTotal=" + countTotal +
                ", pageTotal=" + pageTotal +
                ", start=" + start +
                ", end=" + end +
                '}';
    }
}
